#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 定义数据结构
#define MAX_CATEGORY_LEN 20
#define MAX_NOTE_LEN 50
#define MAX_DATE_LEN 11

// 交易类型枚举
typedef enum {
    INCOME,   // 收入
    EXPENSE   // 支出
} TransactionType;

// 账务记录结构
typedef struct {
    long id;                    // 交易ID
    char date[MAX_DATE_LEN];    // 日期 YYYY-MM-DD
    TransactionType type;       // 交易类型
    char category[MAX_CATEGORY_LEN]; // 类别
    double amount;              // 金额
    char note[MAX_NOTE_LEN];    // 备注
} FinanceRecord;

typedef FinanceRecord DataType;

// 单链表节点
typedef struct Node {
    DataType data;
    struct Node *next;
} SLNode;

// 函数声明
void ListInitiate(SLNode **head);
int ListLength(SLNode *head);
int ListInsert(SLNode *head, int i, DataType x);
int ListDelete(SLNode *head, int i, DataType *x);
void Destroy(SLNode **head);
void addRecord(SLNode *head);
void deleteRecord(SLNode *head);
void modifyRecord(SLNode *head);
void queryById(SLNode *head);
void queryByCategory(SLNode *head);
void queryByAmountRange(SLNode *head);
void displayAll(SLNode *head);
void statistics(SLNode *head);
void sortByAmount(SLNode *head, int ascending);
void saveToFile(SLNode *head, const char *filename);
void loadFromFile(SLNode *head, const char *filename);
void handleMenu(SLNode *head);
void displayMenu();

int main() {
    SLNode *head;
    
    // 初始化随机数种子
    srand((unsigned int)time(NULL));
    
    // 初始化链表
    ListInitiate(&head);
    
    printf("欢迎使用个人账务管理系统！\n");
    
    // 处理菜单
    handleMenu(head);
    
    // 退出前自动保存
    saveToFile(head, "finance_data.txt");
    
    // 清理内存
    Destroy(&head);
    
    printf("程序已退出。\n");
    return 0;
}